package com.ruoyi.common.utils;

import lombok.Getter;

import java.util.*;
import java.util.stream.Collectors;

public class DataUtils {

    /**
     * 按num分组，每组随机选择一条数据
     * @param dataList 原始数据列表
     * @return 每个num随机一条的结果列表
     */
    public static List<Data> selectRandomByNum(List<Data> dataList) {
        if (dataList == null || dataList.isEmpty()) {
            return Collections.emptyList();
        }

        // 1. 按num分组：Map<num值, 同num的元素列表>
        Map<Integer, List<Data>> groupByNum = dataList.stream()
                .collect(Collectors.groupingBy(Data::num));

        // 2. 每组随机选择一条
        Random random = new Random();
        List<Data> result = new ArrayList<>();
        for (List<Data> group : groupByNum.values()) {
            // 随机获取组内一个元素的索引
            int randomIndex = random.nextInt(group.size());
            result.add(group.get(randomIndex));
        }

        return result;
    }

    /**
     * 泛型方法：按num分组，每组随机选择一条数据
     * @param dataList 原始数据列表（元素需实现HasNum接口）
     * @param <T> 任意实现了HasNum接口的类型
     * @return 每个num随机一条的结果列表
     */
    public static <T extends DataGroupByData> List<T> selectRandomByNumList(List<T> dataList) {
        if (dataList == null || dataList.isEmpty()) {
            return Collections.emptyList();
        }

        // 1. 按num分组：Map<num值, 同num的元素列表>
        Map<Integer, List<T>> groupByNum = dataList.stream()
                .collect(Collectors.groupingBy(DataGroupByData::getGroupByData)); // 调用接口方法获取num

        // 2. 每组随机选择一条
        Random random = new Random();
        List<T> result = new ArrayList<>(groupByNum.size()); // 预设容量
        for (List<T> group : groupByNum.values()) {
            if (group == null || group.isEmpty()) {
                continue; // 防御性判断
            }
            int randomIndex = random.nextInt(group.size());
            result.add(group.get(randomIndex));
        }

        return result;
    }

    record Data(int num, String value) {

    }
}
